home *** CD-ROM | disk | FTP | other *** search
/ Whiteline: delta / whiteline CD Series - delta.iso / progtool / modula2 / module / liste.mod < prev    next >
Text File  |  1995-11-25  |  4KB  |  174 lines

  1. IMPLEMENTATION MODULE  Liste;
  2.  
  3. FROM SYSTEM IMPORT TSIZE;
  4. FROM Storage IMPORT ALLOCATE,DEALLOCATE;
  5.  
  6. TYPE List               = POINTER TO ListHeader;
  7.      ListElementPointer = POINTER TO ListElement;
  8.      ListHeader         = RECORD
  9.                              current,
  10.                              first,last : ListElementPointer;
  11.                           END ;
  12.      ListElement        = RECORD
  13.                              next,prev     : ListElementPointer;
  14.                              value         :ARRAY[0..9] OF INTEGER;
  15.                           END ;
  16.  
  17. PROCEDURE MakeList(VAR L:List);
  18. BEGIN
  19.    ALLOCATE(L,TSIZE(ListHeader));
  20.    L^.first:=NIL;
  21.    L^.last:=NIL;
  22.    L^.current:=NIL;
  23. END MakeList;
  24.  
  25. PROCEDURE KillList(VAR L:List);
  26. VAR p,q:ListElementPointer;
  27. BEGIN
  28.     p:=L^.first;
  29.     WHILE (p#NIL) DO
  30.       q:=p;
  31.       p:=p^.next;
  32.       DEALLOCATE(q);
  33.     END(*WHILE*);
  34.     DEALLOCATE(L);
  35.     L:=NIL
  36. END KillList;
  37.  
  38. PROCEDURE First(VAR L:List);
  39. BEGIN
  40.     L^.current:=L^.first;
  41. END First;
  42.  
  43. PROCEDURE Last(VAR L:List);
  44. BEGIN
  45.     L^.current:=L^.last;
  46. END Last;
  47.  
  48. PROCEDURE Next(VAR L:List);
  49. BEGIN
  50.    IF (~Empty(L) AND (L^.current^.next # NIL))THEN
  51.       L^.current:=L^.current^.next;
  52.    END(*IF*);
  53. END Next;
  54.  
  55. PROCEDURE Prev(VAR L:List);
  56. BEGIN
  57.    IF (~Empty(L) AND (L^.current^.prev # NIL))THEN
  58.       L^.current:=L^.current^.prev;
  59.    END(*IF*);
  60. END Prev;
  61.  
  62. PROCEDURE Empty(VAR L:List):BOOLEAN;
  63. BEGIN
  64.    RETURN L^.first=NIL
  65. END Empty;
  66.  
  67. PROCEDURE AtFirst(VAR L:List):BOOLEAN;
  68. BEGIN
  69.    RETURN L^.current=L^.first
  70. END AtFirst;
  71.  
  72. PROCEDURE AtLast(VAR L:List):BOOLEAN;
  73. BEGIN
  74.    RETURN L^.current=L^.last
  75. END AtLast;
  76.  
  77. PROCEDURE GetValue(VAR L:List;VAR Value :ARRAY OF INTEGER):BOOLEAN;
  78. VAR i:INTEGER;
  79. BEGIN
  80.    IF ~Empty(L) THEN
  81.      FOR i:=0 TO HIGH(L^.current^.value) DO
  82.          Value[i]:=L^.current^.value[i];
  83.      END(*FOR*);
  84.      RETURN TRUE
  85.    ELSE
  86.      RETURN FALSE
  87.    END(*IF*);
  88. END GetValue;
  89.  
  90. PROCEDURE SetValue(VAR L:List;Value :ARRAY  OF INTEGER);
  91. VAR  i:INTEGER;
  92. BEGIN
  93.    IF ~Empty(L) THEN
  94.      FOR i:=0 TO HIGH(L^.current^.value) DO
  95.          L^.current^.value[i]:=Value[i];
  96.      END(*FOR*);
  97.    END(*IF*);
  98. END SetValue;
  99.  
  100. PROCEDURE EnterElement(VAR L:List);
  101. VAR p,q :ListElementPointer;
  102. BEGIN
  103.    ALLOCATE(p,TSIZE(ListElement));
  104.    IF Empty(L) THEN
  105.          L^.first:=p;
  106.          L^.last:=p;
  107.          p^.next:=NIL;
  108.          p^.prev:=NIL;
  109.    ELSIF AtFirst(L) THEN
  110.          p^.next:=L^.first;
  111.          L^.first:=p;
  112.          p^.prev:=NIL;
  113.          L^.current^.prev:=p;
  114.    ELSE
  115.          p^.next:=L^.current;
  116.          p^.prev:=L^.current^.prev;
  117.          q:=L^.current^.prev;
  118.          q^.next:=p;
  119.          L^.current^.prev:=p;
  120.   END(*IF*);
  121.   L^.current:=p;
  122. END EnterElement;
  123.  
  124. PROCEDURE AppendElement(VAR L:List);
  125. VAR p,q :ListElementPointer;
  126. BEGIN
  127.    ALLOCATE(p,TSIZE(ListElement));
  128.    IF Empty(L) THEN
  129.          L^.first:=p;
  130.          L^.last:=p;
  131.          p^.next:=NIL;
  132.          p^.prev:=NIL;
  133.    ELSIF AtLast(L) THEN
  134.          p^.prev:=L^.last;
  135.          L^.last:=p;
  136.          p^.next:=NIL;
  137.          L^.current^.next:=p;
  138.    ELSE
  139.          p^.next:=L^.current^.next;
  140.          p^.prev:=L^.current;
  141.          q:=L^.current^.next;
  142.          q^.prev:=p;
  143.          L^.current^.next:=p;
  144.   END(*IF*);
  145.   L^.current:=p;
  146. END AppendElement;
  147.  
  148. PROCEDURE RemoveElement(VAR L:List);
  149. VAR p,q :ListElementPointer;
  150. BEGIN
  151.    IF ~Empty(L) THEN
  152.    p:=L^.current;
  153.    IF (AtFirst(L) AND AtLast(L)) THEN
  154.        L^.first:=NIL;
  155.        L^.last:=NIL;
  156.        L^.current:=NIL;
  157.    ELSIF AtFirst(L) THEN
  158.        L^.first:=L^.current^.next;
  159.        L^.first^.prev:=NIL;
  160.        L^.current:=L^.current^.next;
  161.    ELSIF AtLast(L) THEN
  162.        L^.last:=L^.current^.prev;
  163.        L^.last^.next:=NIL;
  164.        L^.current:=L^.current^.prev;
  165.    ELSE
  166.        p^.prev^.next:=p^.next;
  167.        p^.next^.prev:=p^.prev;
  168.        L^.current:=L^.current^.next;
  169.    END(*IF*);
  170.    DEALLOCATE(p);
  171.    END(*IF*);
  172. END RemoveElement;
  173. END Liste.
  174.